import java.util.*;
/**
 * 
 * 旋转数组
 * 描述

一个数组A中存有 n 个整数，在不允许使用另外数组的前提下，将每个整数循环向右移 M（ M >=0）个位置，即将A中的数据由（A0 A1 ……AN-1 ）变换为（AN-M …… AN-1 A0 A1 ……AN-M-1 ）（最后 M 个数循环移至最前面的 M 个位置）。如果需要考虑程序移动数据的次数尽量少，要如何设计移动的方法？

数据范围：
0
<
n
≤
100
0<n≤100，
0
≤
m
≤
1000
0≤m≤1000
进阶：空间复杂度 
O
(
1
)
O(1)，时间复杂度 
O
(
n
)
O(n)
 */
public class 旋转数组 {
    
    public static void main(String[] args) {
        
        int[] result = solve(6, 2, new int[]{1,2,3,4,5,6});

        Arrays.stream(result).forEach(System.out::print);
        System.out.println();
    }

    /**
     * 代码中的类名、方法名、参数名已经指定，请勿修改，直接返回方法规定的值即可
     *
     * 旋转数组
     * @param n int整型 数组长度
     * @param m int整型 右移距离
     * @param a int整型一维数组 给定数组
     * @return int整型一维数组
     */
    public static int[] solve (int n, int m, int[] a) {
        // write code here
        m %= n;
        reverse(a, 0, n - 1);
        reverse(a, 0, m - 1);
        reverse(a, m, n - 1);

        return a;
    }

    private static void reverse(int[] nums, int start, int end) {
        while (start < end) {
            int temp = nums[start];
            nums[start] = nums[end];
            nums[end] = temp;
            start++;
            end--;
        }
    }
}
